/******************************************************************************************
 * Import
 ******************************************************************************************/

// module
import _ from 'lodash';

// project
import Collect from '../collect';

/******************************************************************************************
 * Export Class
 ******************************************************************************************/

export default class parseHesq {

    /**
     * 解析
     * 
     * @param {String} responseText http返回的值
     * @param {Object} obj 原始请求设置对象
     */
    static action(responseText, obj) {

        // 判断字符串是否能被解析为json对象，如果成功则将responseText转换为json，否则报解析错误
        // 注意：taro有时会自动将字符串转换为json，所以，这里需要做判断，看responseText是否为string，如果已经是json，就不要转转了
        if (_.isString(responseText)) {
            try {
                responseText = JSON.parse(responseText);
            } catch(e) {
                Collect.parseFail(responseText, obj);
                if (_.isObject(obj.config.fail) && _.isFunction(obj.config.fail.parse)) {
                    obj.config.fail.parse(responseText, obj);
                }
                return;
            }
        }

        // 转换为json
        const json = _.isString(responseText) ? JSON.parse(responseText) : responseText;

        // json格式判断，如果返回没有带code字段，则说明服务器出错，收集错误，调用错误回调，并直接返回
        const contain = ['code', 'msg', 'data'];
        for (let item of contain) {
            if (!_.has(json, item)) {
                Collect.formatFail(responseText, obj);
                if (_.isObject(obj.config.fail) && _.isFunction(obj.config.fail.format)) {
                    obj.config.fail.format(responseText, obj);
                }
                return;
            }
        }

        // 逻辑错误判断，如果code不等于0，则说明存在逻辑错误，收集错误，调用错误回调，并直接返回
        if (parseInt(json.code) != 0) {
            if (_.isFunction(obj.error)) {
                obj.error(json, obj);
            }
            return;
        }

        // 已经全部正确正确，调用success回调
        if (_.isFunction(obj.success)) {
            obj.success(json.data, obj);
        }
    }
}
